#ifndef TOOLS_IMAGE_COMPARATOR_HPP
#define TOOLS_IMAGE_COMPARATOR_HPP

#include <opencv2/opencv.hpp>
#include <string>
#include <vector>
#include <thread>
#include <memory>
#include <mutex>

namespace toolsLib
{

// 前向声明
class ImageViewer;

class ImageComparator
{
  public:
    ImageComparator();
    ~ImageComparator();

    /**
     * @brief 比较两张图像，将不同的像素用红色透明蒙版遮盖
     * @param image1 第一张图像
     * @param image2 第二张图像
     * @return 比较结果图像，不同像素用红色透明蒙版标记
     */
    cv::Mat compareImages(const cv::Mat& image1, const cv::Mat& image2);

    /**
     * @brief 重载：比较两张图像，返回不同像素的坐标和蒙版图像
     * @param image1 第一张图像
     * @param image2 第二张图像
     * @param diff_pixels 输出参数：不同像素的坐标列表 (x, y)
     * @param masked_image 输出参数：带红色透明蒙版的结果图像
     */
    void compareImages(const cv::Mat& image1, const cv::Mat& image2, 
                       std::vector<std::pair<int, int>>& diff_pixels, 
                       cv::Mat& masked_image);

    /**
     * @brief 设置红色蒙版的透明度（0.0-1.0）
     * @param alpha 透明度值，0.0为完全透明，1.0为完全不透明
     */
    void setMaskAlpha(double alpha);

    /**
     * @brief 设置像素差异的容差值
     * @param tolerance 容差值，像素差值小于此值视为相同
     */
    void setTolerance(int tolerance);

    /**
     * @brief 比较并显示两张图像（在独立线程中执行，不阻塞调用线程）
     * @param image1 第一张图像
     * @param image2 第二张图像
     * @param bind_name 绑定名称，用于同步显示
     */
    void compareImagesDisplay(const cv::Mat& image1, const cv::Mat& image2, const std::string& bind_name);

    /**
     * @brief 销毁指定 bind_name 的绑定窗口
     * @param bind_name 绑定名称
     */
    void compareDisplayDestory(const std::string& bind_name);

  private:
    /**
     * @brief 调整图像尺寸使其相同
     * @param image1 第一张图像（将被调整）
     * @param image2 第二张图像（将被调整）
     */
    void resizeToSameSize(cv::Mat& image1, cv::Mat& image2);

    /**
     * @brief 将图像转换为相同格式（统一为BGR格式）
     * @param image1 第一张图像（将被转换）
     * @param image2 第二张图像（将被转换）
     */
    void convertToSameFormat(cv::Mat& image1, cv::Mat& image2);

    /**
     * @brief 比较两个像素值是否相同
     * @param pixel1 第一个像素值
     * @param pixel2 第二个像素值
     * @param channels 通道数
     * @return 如果不同返回 true，否则返回 false
     */
    bool isPixelDifferent(const cv::Vec3b& pixel1, const cv::Vec3b& pixel2, int channels);

    /**
     * @brief 创建红色透明蒙版
     * @param image 原始图像
     * @param diff_mask 差异掩码（非零值表示不同像素）
     * @return 带红色蒙版的结果图像
     */
    cv::Mat applyRedMask(const cv::Mat& image, const cv::Mat& diff_mask);

  private:
    double mask_alpha_;    // 红色蒙版的透明度（0.0-1.0）
    int    tolerance_;     // 像素差异容差值
    std::unique_ptr<ImageViewer> viewer_;  // 图像查看器实例
    std::mutex viewer_mutex_;  // 保护 viewer_ 的互斥锁
    
    // 显示线程函数
    static void displayThreadFunc(ImageComparator* comparator, 
                                  const cv::Mat& image1, 
                                  const cv::Mat& image2, 
                                  const std::string& bind_name);
};

}  // namespace toolsLib

#endif  // TOOLS_IMAGE_COMPARATOR_HPP

